package negocio.cliente;

import java.net.InetAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.ArrayList;

import com.thoughtworks.xstream.XStream;

import negocio.beans.Conversa;
import negocio.beans.Usuario;
import negocio.cliente.negocio.Controle;

import base.transporte.SRConnector;
import base.transporte.SRPacket;
import base.transporte.SRSocket;

public class FachadaCliente {
	private static FachadaCliente instancia = null;
	private InetAddress enderecoServidor;
	private SRSocket sktServidor = null;
	private Usuario usuarioLocal = null;
	private Cliente clienteApp = null;

	private FachadaCliente (){
		
	}
	
	
	public static FachadaCliente getInstance() {
		if (instancia == null) {
			instancia = new FachadaCliente();
		}

		return instancia;
	}

	public void setEnderecoServidor(String ip) throws UnknownHostException, SocketTimeoutException {
			enderecoServidor = InetAddress.getByName(ip);
			SRConnector conector = new SRConnector(enderecoServidor, 55000, "Conexao Servidor");
			sktServidor = conector.abrirConexao();
		
	}
	
	public Usuario getUsuarioLocal(){
		return this.usuarioLocal;
	}
	
	public InetAddress getEnderecoServidor(){
		return sktServidor.getRemoteIP();
	}

	public String cadastrarCliente(String login, String senha, String nome) {
		String comando = "CADASTRAR " + login + " " + senha + " " + nome;
		String retorno = null;
		try {
			sktServidor.enviarPacote(new SRPacket(0, comando.getBytes()));

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		retorno = new String(sktServidor.receberPacote().getData());

		return retorno;
	}

	public String logar(String login, String senha) {
		String comando = "LOGAR " + login + " " + senha;
		String retorno = null;

		try {
			sktServidor.enviarPacote(new SRPacket(0, comando.getBytes()));

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		retorno = new String(sktServidor.receberPacote().getData());
		if (retorno.equals("LOGIN_SUCESSO")) {
			usuarioLocal = buscarUsuario(new Usuario(login));
			clienteApp = new Cliente(usuarioLocal, sktServidor);
		}

		return retorno;
	}

	public void mudarStatus(String status) {
		clienteApp.mudarStatus(status);
	}

	public void deslogar() {
		clienteApp.deslogar();
	}

	public ArrayList<Usuario> getAmigos() {
		return clienteApp.getAmigos();
	}

	public ArrayList<Usuario> getAmigosPendentes() {
		return clienteApp.getAmigosPendentes();

	}

	public void recusarPedidoAmizade(Usuario amigo, boolean paraSempre){
		this.clienteApp.recusarPedidoAmizade(amigo, paraSempre);
	}
	
	public void aprovarAmizade(Usuario amigo){
		this.clienteApp.aprovarAmizade(amigo);
	}
	
	public void inserirPedidoAmizade(Usuario novoAmigo){
		this.clienteApp.inserirPedidoAmizade(novoAmigo);
	}

	public void mudarNome(String nome){
		clienteApp.mudarNome(nome);
	}
	public void mudarSenha(String senha){
		clienteApp.mudarSenha(senha);
	}
	
	public void mudarFoto(String foto){
		clienteApp.mudarFoto(foto);
	}
	
	public Usuario buscarUsuario(Usuario usuario){
		Usuario retorno = null;
		String comando = "BUSCAR_USUARIO " + usuario.getLogin();
		
		try {
			sktServidor.enviarPacote(new SRPacket(0, comando.getBytes()));
			SRPacket pkt = sktServidor.receberPacote();
			String resposta = new String(pkt.getData());
			if(resposta.equals("INICIO_USUARIO")){
				String pacote = null;
				String xml = new String();
				pacote = new String(sktServidor.receberPacote().getData());

				while (!pacote.equals("FIM_USUARIO")) {
					xml += pacote;
					pacote = new String(sktServidor.receberPacote().getData());
				}
				XStream xstream = new XStream();
				xstream.processAnnotations(Usuario.class);

				retorno = (Usuario) xstream.fromXML(xml);
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		return retorno;
	}
	
	public Conversa iniciarConversa(Usuario usuario, Conversa conversa) {
		return clienteApp.iniciarConversa(usuario, conversa);
	}
	
	public void adicionarPessoaAConversa(String idConversa, Usuario usuario) {
		clienteApp.adicionarPessoaAConversa(idConversa, usuario);
	}
	
	public Controle getControle() {
		return clienteApp.controle;
	}

}
